package com.seedog.mq.core;

import com.seedog.mq.model.Message;
import com.seedog.mq.exception.TopicNotFoundException;

import java.util.List;
import java.util.Set;

/**
 * 消息队列接口，提供主题管理和消息路由功能
 */
public interface MessageQueue {
    /**
     * 创建主题
     * @param topicName 主题名称
     * @return 是否创建成功
     */
    boolean createTopic(String topicName);
    
    /**
     * 删除主题
     * @param topicName 主题名称
     * @return 是否删除成功
     */
    boolean deleteTopic(String topicName);
    
    /**
     * 检查主题是否存在
     * @param topicName 主题名称
     * @return 主题是否存在
     */
    boolean topicExists(String topicName);
    
    /**
     * 获取所有主题名称
     * @return 主题名称集合
     */
    Set<String> getAllTopics();
    
    /**
     * 向指定主题发送消息
     * @param topicName 主题名称
     * @param message 消息对象
     * @return 消息ID
     * @throws TopicNotFoundException 如果主题不存在
     */
    String sendMessage(String topicName, Message message) throws TopicNotFoundException;
    
    /**
     * 向指定主题批量发送消息
     * @param topicName 主题名称
     * @param messages 消息列表
     * @return 已发送的消息ID列表
     * @throws TopicNotFoundException 如果主题不存在
     */
    List<String> sendMessages(String topicName, List<Message> messages) throws TopicNotFoundException;
    
    /**
     * 从指定主题消费消息
     * @param topicName 主题名称
     * @param consumerId 消费者ID
     * @param timeout 超时时间（毫秒）
     * @return 消息对象，如果没有消息则返回null
     * @throws TopicNotFoundException 如果主题不存在
     */
    Message pollMessage(String topicName, String consumerId, long timeout) throws TopicNotFoundException;
    
    /**
     * 确认消息已被消费
     * @param topicName 主题名称
     * @param consumerId 消费者ID
     * @param messageId 消息ID
     * @return 是否确认成功
     * @throws TopicNotFoundException 如果主题不存在
     */
    boolean acknowledge(String topicName, String consumerId, String messageId) throws TopicNotFoundException;
    
    /**
     * 获取指定主题的消息数量
     * @param topicName 主题名称
     * @return 消息数量
     * @throws TopicNotFoundException 如果主题不存在
     */
    int getMessageCount(String topicName) throws TopicNotFoundException;
    
    /**
     * 关闭消息队列
     */
    void shutdown();
}